You can use any dataset for this task accessible by the pandas-datareader module. You should explain what the dataset is about and which part of it will you visualize!
If the pandas-datareader package is not available in your notebook, then either stop, delete and restart your course container on the Kooplex hub page, or install into your userspace
pip install --user pandas-datareader
When you finished with the notebook, then
jupyter-nbconvert --execute worksheet-interactive.ipynbYou can find further interactive tools on the pyviz site:
!pip install --user pandas-datareader
import pandas_datareader.data as pdr
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.graph_objects as py
import plotly.express as px
#import ipywidgets as wg
Load HUF/CHF excahge values:
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2021, 1, 27)
Change = pdr.DataReader('HUF/CHF', 'av-forex-daily', start, end, api_key = 'ALPHAVANTAGE_API_KEY')
Change
HC_open = Change.values[:,0]
HC_high = Change.values[:,1]
HC_low = Change.values[:,2]
HC_close = Change.values[:,3]
t = Change.index.values
The exchange rate for the entire time scale. You can select the highest and lowest values ​​of the day and the opening and closing values:
fig = py.Figure()
fig.update_layout(autosize=False, width=1000, height=500)
change = [HC_open, HC_close, HC_high, HC_low]
name = ["Opening value", "Closing value", "Daily high value", "Daily low value"]
for i in np.arange(0,4):
fig.add_trace(
py.Scatter(
x = t,
y = change[i],
name = name[i]))
fig.update_layout(
yaxis = dict(title = 'Exchange rate (HUF/CHF)'),
xaxis = dict(title = 'ate'),
title = "HUF/CHF exchange values",
updatemenus=[py.layout.Updatemenu(
active=0,
buttons=list(
[dict(label = 'All value',
method = 'update',
args = [{'visible': [True, True, True, True]}]),
dict(label = name[0],
method = 'update',
args = [{'visible': [True, False, False, False]}]),
dict(label = name[1],
method = 'update',
args = [{'visible': [False, True, False, False]}]),
dict(label = name[2],
method = 'update',
args = [{'visible': [False, False, True, False]}]),
dict(label = name[3],
method = 'update',
args = [{'visible': [False, False, False, True]}]),
]),
pad={"r": 10, "t": 10},
showactive=True,
x=0.8,
xanchor="left",
y=1.0,
yanchor="top"
)])
fig.show()
Daily average of max and min:
fig = py.Figure()
fig.add_trace(
py.Scatter(x=t,
y=change[2],
name="Daily maximum",
line=dict(color="red")))
fig.add_trace(
py.Scatter(x=t,
y=np.mean(change[2]) * np.ones_like(t),
name="Average daily maximum",
line=dict(color="red", dash="dash")))
fig.add_trace(
py.Scatter(x=t,
y=change[3],
name="Daily minimum",
visible=False,
line=dict(color="green")))
fig.add_trace(
py.Scatter(x=t,
y=np.mean(change[3]) * np.ones_like(t),
name="Average daily minimum",
visible=False,
line=dict(color="green", dash="dash")))
fig.add_trace(
py.Scatter(x=t,
y=(change[3]+change[2])/2 * np.ones_like(t),
name="Daily average",
visible=False,
line=dict(color="orange")))
fig.add_trace(
py.Scatter(x=t,
y=np.mean((change[3]+change[2])/2) * np.ones_like(t),
name="Average",
visible=False,
line=dict(color="orange", dash="dash")))
# Buttons and average value
high_av = [dict(x="2015-01-01",
y=np.mean(change[2]),
xref="x", yref="y",
text="Average maximum: %.6f" %np.mean(change[2]),
ax=100, ay=-60)]
low_av = [dict(x="2021-01-27",
y=np.mean(change[3]),
xref="x", yref="y",
text="Average minimum: %.6f" % np.mean(change[3]),
ax=0, ay=50)]
av = [dict(x="2021-01-27",
y=np.mean(change[3]),
xref="x", yref="y",
text="Average: %.6f" % np.mean((change[3]+change[2])/2),
ax=0, ay=50)]
fig.update_layout(
yaxis = dict(title = 'Exchange rate (HUF/CHF)'),
xaxis = dict(title = 'Date'),
updatemenus=[
dict(
type="buttons",
direction="right",
active=0,
x=1,
y=1.2,
buttons=list([
dict(label="Average maximum",
method="update",
args=[{"visible": [True, True, False, False, False, False]},
{"title": "Average maximum",
"annotations": high_av}]),
dict(label="Average minimum",
method="update",
args=[{"visible": [False, False, True, True, False, False]},
{"title": "Average minimum",
"annotations": low_av}]),
dict(label="Daily average",
method="update",
args=[{"visible": [False, False, False, False, True, True]},
{"title": "Daily average",
"annotations": av}]),
]),
)
])
# Title
fig.update_layout( title_text="Average maximum", xaxis_domain=[0.01, 1.0] )
fig.show()
np.mean((change[3]+change[2])/2)
Selecting the time scale will help to better monitor the change in value:
# Create figure
fig = py.Figure()
change = [HC_open, HC_close, HC_high, HC_low]
name = ["Opening value", "Closing value", "Daily high value", "Daily low value"]
vis = [True, False, False, False]
for i in np.arange(0,4):
fig.add_trace(
py.Scatter(
x = t,
y = change[i],
visible = vis[i],
name = name[i] ))
# Set title
fig.update_layout( title_text="Exchange data with range slider and selectors", xaxis_domain=[0.01, 1.0])
# Add range slider
fig.update_layout(
xaxis=dict(
rangeselector=dict(
buttons=list(
[dict(count=1,
label="month",
step="month",
stepmode="backward"),
dict(count=6,
label="half year",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="year",
step="year",
stepmode="backward"),
dict(step="all"),])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.update_layout(
yaxis = dict(title = 'Exchange rate (HUF/CHF)'),
xaxis = dict(title = 'Date'),
updatemenus=[py.layout.Updatemenu(
active=0,
buttons=list(
[dict(label = name[0],
method = 'update',
args = [{'visible': [True, False, False, False]}]),
dict(label = name[1],
method = 'update',
args = [{'visible': [False, True, False, False]}]),
dict(label = name[2],
method = 'update',
args = [{'visible': [False, False, True, False]}]),
dict(label = name[3],
method = 'update',
args = [{'visible': [False, False, False, True]}]),
]),
pad={"r": 10, "t": 10},
showactive=True,
x=0.8,
xanchor="left",
y=1.0,
yanchor="top"
)])
fig.show()
Histogram helps to recognize how many different values was in data. This shows how oscillating / stable the change value.
fig = py.Figure()
fig.update_layout(autosize=False, width=1000, height=500)
change = [HC_open, HC_close, HC_high, HC_low]
name = ["Opening value", "Closing value", "Daily high value", "Daily low value"]
years = [2015, 2016, 2017, 2018, 2019, 2020, 2021]
#months = [January, February, March, April, May, June, July, August, September, October, November, December]
months1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
for i in np.arange(0,4):
fig.add_trace(
py.Histogram(
x = change[i],
name=name[i]))
fig.update_layout(
yaxis = dict(title = 'Counts'),
xaxis = dict(title = 'Exchange rate (HUF/CHF)'),
title = "HUF/CHF exchange values histogram",
updatemenus=[py.layout.Updatemenu(
active=0,
buttons=list(
[dict(label = 'All value',
method = 'update',
args = [{'visible': [True, True, True, True]}]),
dict(label = name[0],
method = 'update',
args = [{'visible': [True, False, False, False]}]),
dict(label = name[1],
method = 'update',
args = [{'visible': [False, True, False, False]}]),
dict(label = name[2],
method = 'update',
args = [{'visible': [False, False, True, False]}]),
dict(label = name[3],
method = 'update',
args = [{'visible': [False, False, False, True]}]),
]),
pad={"r": 10, "t": 10},
showactive=True,
x=0.8,
xanchor="left",
y=1.0,
yanchor="top"
)])